Author: Kareem Hamoudeh
import pandas as pd
import plotly.express as px
import numpy as np
dat = pd.read_csv("assetts/kirby21.csv").drop(['Unnamed: 0'], axis = 1)
dat = dat.assign(id_char = dat.id.astype(str))
icv = dat.groupby(['id']).volume.sum().reset_index().rename(columns = {'volume' : 'icv'})
dat = pd.merge(dat, icv, on = 'id')
dat = dat.assign(comp = dat.volume / dat.icv)
## load in the hierarchy information
url = "https://raw.githubusercontent.com/bcaffo/MRIcloudT1volumetrics/master/inst/extdata/multilevel_lookup_table.txt"
multilevel_lookup = pd.read_csv(url, sep = "\t").drop(['Level5'], axis = 1)
multilevel_lookup = multilevel_lookup.rename(columns = {
"modify" : "roi",
"modify.1" : "level4",
"modify.2" : "level3",
"modify.3" : "level2",
"modify.4" : "level1"})
multilevel_lookup = multilevel_lookup[['roi', 'level4', 'level3', 'level2', 'level1']]
## Now load in the subject data
id = 127
subjectData = pd.read_csv("assetts/kirby21AllLevels.csv")
subjectData = subjectData.loc[(subjectData.type == 1) & (subjectData.level == 5) & (subjectData.id == id)]
subjectData = subjectData[['roi', 'volume']]
## Merge the subject data with the multilevel data
subjectData = pd.merge(subjectData, multilevel_lookup, on = "roi")
subjectData = subjectData.assign(icv = "ICV")
subjectData = subjectData.assign(comp = subjectData.volume / np.sum(subjectData.volume))
1) Make tables for connections. ICV-> 1, 1->2, 2>3 etc... 2) Label list 3) for loop for each pair (ICV - CSF/Diencephelon... | Level1 - CSF/Die...) 4) populate source/target/value with numbers corresponding to the indices of list of labels
labels = brain structures
value = composition
source = for level0-1: ICV| level1-2: level1 | Level2-3: level2| level3-4
target =
# Grouping level 0 (icv) and level 1
icv_one = subjectData.groupby(['icv', 'level1']).sum().reset_index().drop('volume', axis = 1)
one_two = subjectData.groupby(['level1', 'level2']).sum().reset_index().drop('volume', axis = 1)
two_three = subjectData.groupby(['level2', 'level3']).sum().reset_index().drop('volume', axis = 1)
three_four = subjectData.groupby(['level3', 'level4']).sum().reset_index().drop('volume', axis = 1)
import plotly.graph_objects as go
labels = ['ICV']
for i in icv_one['level1']:
labels.append(i)
for i in one_two['level2']:
labels.append(i)
for i in two_three['level3']:
labels.append(i)
for i in three_four['level4']:
labels.append(i)
value = []
for i in icv_one['comp']:
value.append(i)
for i in one_two['comp']:
value.append(i)
for i in two_three['comp']:
value.append(i)
for i in three_four['comp']:
value.append(i)
# Trying to make a for loop to append source and target lists
index_list = []
for i in range(226):
index_list.append(i)
sourcetest = []
for i in icv_one['icv']:
level1_index = labels.index(i)
sourcetest.append(index_list[level1_index])
for i in one_two['level1']:
level1_index = labels.index(i)
sourcetest.append(index_list[level1_index])
# for i in two_three['level2']:
# level1_index = labels.index(i)
# sourcetest.append(index_list[level1_index])
# for i in three_four['level3']:
# level1_index = labels.index(i)
# sourcetest.append(index_list[level1_index])
targettest = []
for i in icv_one['level1']:
level2_index = labels.index(i)
targettest.append(index_list[level2_index])
for i in one_two['level2']:
level2_index = labels.index(i)
targettest.append(index_list[level2_index])
# for i in two_three['level3']:
# level2_index = labels.index(i)
# targettest.append(index_list[level2_index])
# for i in three_four['level4']:
# level2_index = labels.index(i)
# targettest.append(index_list[level2_index])
**ICV -> level1 -> level2
# data to dict, dict to sankey
link = dict(source = sourcetest, target = targettest, value = value)
node = dict(label = labels, pad=15, thickness=5)
data = go.Sankey(link = link, node=node)
# plot
fig = go.Figure(data)
fig.show()
for i in two_three['level2']:
level1_index = labels.index(i)
sourcetest.append(index_list[level1_index])
for i in two_three['level3']:
level2_index = labels.index(i)
targettest.append(index_list[level2_index])
# data to dict, dict to sankey
link = dict(source = sourcetest, target = targettest, value = value)
node = dict(label = labels, pad=2, thickness=5)
data = go.Sankey(link = link, node=node)
# plot
fig = go.Figure(data)
fig.show()
for i in three_four['level3']:
level1_index = labels.index(i)
sourcetest.append(index_list[level1_index])
for i in three_four['level4']:
level2_index = labels.index(i)
targettest.append(index_list[level2_index])
# data to dict, dict to sankey
link = dict(source = sourcetest, target = targettest, value = value)
node = dict(label = labels, pad=2, thickness=5)
data = go.Sankey(link = link, node=node)
# plot
fig = go.Figure(data)
fig.show()